﻿using System;
using GestorDeFlotasDesktop.Listados;
using System.Windows.Forms;
using Controllers;
using System.Linq;
using System.Collections.Generic;

namespace GestorDeFlotasDesktop
{
    public partial class AbmTurno : Form
    {
        private string horainicio = "";
        private string horafin = "";
        public AbmTurno()
        {
            InitializeComponent();
        }

        #region Propiedades

        public lstTurnos parentForm { get; set; }
        public Turno turno { get; set; }
        public Operacion operacion { get; set; }
        private bool valido = true;

        #endregion

        #region Eventos

        private void AbmTurno_Load(object sender, EventArgs e)
        {

            if (operacion == Operacion.Alta)
            {
                chkHabilitado.Checked = true;
                lblOperacion.Text = "Nuevo";
            }
            else
            {
                CargarForm();
                if (operacion == Operacion.Baja)
                {
                    InhabilitarForm();
                    lblOperacion.Text = "Eliminar";
                    btnLimpiar.Enabled = false;
                }
                else
                {
                    lblOperacion.Text = "Modificar";
                }

            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {           
            if (operacion == Operacion.Baja)
            {
                TurnoController.Eliminar(turno.Turno_Id);
                MessageBox.Show("El turno fue eliminado con éxito");
                if (parentForm != null) parentForm.ActualizarGrilla();
                Close();
            }
            else
            {
                bool a = true;
                var turnoId = -1;
                if(turno != null)
                    turnoId =turno.Turno_Id;

                a = validarHorarios(turnoId, cmbInicio.SelectedItem.ToString(), cmbFin.SelectedItem.ToString());
                if (!a)
                {
                    MessageBox.Show("Los horarios no se pueden superponer");
                    return;
                }

                ValidarForm(sender, e);
                if (valido)
                {
                    if (operacion == Operacion.Alta)
                    {
                        turno = CargarObjeto();
                        TurnoController.Agregar(turno);
                        MessageBox.Show("El turno fue dado de alta con éxito");
                    }
                    else if (operacion == Operacion.Modificacion)
                    {
                        turno = CargarObjeto();
                        TurnoController.Modificar(turno);
                        MessageBox.Show("El turno fue modificado con éxito");
                    }

                    LimpiarForm();
                    turno = null;
                    if (parentForm != null) parentForm.ActualizarGrilla();
                    Close();
                }
                valido = true;
            }
            
        }
        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            txtDescripcion_Validated(sender, e);
            txtValorBandera_Validated(sender, e);
            txtValorFicha_Validated(sender, e);
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {

        }

        #endregion

        #region Metodos del Form

        private Turno CargarObjeto()
        {
            if (turno == null) turno = new Turno();

            turno.Turno_Descripcion = txtDescripcion.Text;
            turno.Turno_Valor_Bandera = decimal.Parse(txtValorBandera.Text.Replace('.',','));
            turno.Turno_Valor_Ficha = decimal.Parse(txtValorFicha.Text.Replace('.', ','));
            turno.Turno_Habilitado = chkHabilitado.Checked;
            turno.Turno_Hora_Fin = decimal.Parse(cmbFin.SelectedItem.ToString());
            turno.Turno_Hora_Inicio = decimal.Parse(cmbInicio.SelectedItem.ToString());
            return turno;
        }

        private void CargarForm()
        {
            txtDescripcion.Text = turno.Turno_Descripcion;
            txtValorBandera.Text = turno.Turno_Valor_Bandera.ToString();
            txtValorFicha.Text = turno.Turno_Valor_Ficha.ToString();
            chkHabilitado.Checked = turno.Turno_Habilitado;
            cmbInicio.SelectedItem  = turno.Turno_Hora_Inicio.ToString();
            cmbFin.SelectedItem = turno.Turno_Hora_Fin.ToString();
            horainicio = turno.Turno_Hora_Inicio.ToString();
            horafin = turno.Turno_Hora_Fin.ToString();
        }

        private void LimpiarForm()
        {
            txtDescripcion.Text = "";
            cmbInicio.SelectedItem = "";
            cmbFin.SelectedItem = "";
            txtValorBandera.Text = "";
            txtValorFicha.Text = "";
            chkHabilitado.Checked = true;
        }

        private void InhabilitarForm()
        {
            txtDescripcion.Enabled = false;
            cmbInicio.Enabled = false;
            cmbFin.Enabled = false;
            txtValorBandera.Enabled = false;
            txtValorFicha.Enabled = false;
            chkHabilitado.Enabled = false;
        }

        #endregion

        #region Validaciones

        private string convertirFecha(string fecha)
        {
            if (fecha.ToString().Length == 1)
            {
                fecha ="0" + fecha + "00";
            }
            else if (fecha.ToString().Length == 2)
            {
                fecha = fecha + "00";
            }

            else if (fecha.ToString().Length == 3)
            {
                fecha = "0" + fecha.Substring(0, 1) +  fecha.Substring(1, 2);
            }

            if (fecha.Substring(0, 2) == "24")
                fecha = "00" + fecha.Substring(2, 2);

            return fecha;
        }

        private  bool validarHorarios(int turnoID ,string inicio,string fin)
        {
            decimal count = 0;
            decimal[] array = new decimal[24];
            var lista = TurnoController.ObtenerTodosHabilitados("");
            List<decimal> list = new List<decimal>();
            lista = lista.Where(x => x.Turno_Id != turnoID).OrderBy(x => x.Turno_Hora_Inicio).ToList();
                
            for (var i = 0; i < lista.Count; i++ )
            {
                if (lista[i].Turno_Hora_Fin > lista[i].Turno_Hora_Inicio)
                {
                    for (var j = lista[i].Turno_Hora_Inicio; j < lista[i].Turno_Hora_Fin; j++)
                        array[int.Parse(j.ToString())] = 1;
                }
                else
                {
                    for (var j = lista[i].Turno_Hora_Inicio; j < 24; j++)
                        array[int.Parse(j.ToString())] = 1;
                    for (var k = 0; k < lista[i].Turno_Hora_Fin; k++)
                        array[int.Parse(k.ToString())] = 1;
                }  
            }

            if (decimal.Parse(fin.ToString()) > decimal.Parse(inicio.ToString()))
            {
                for (var j = decimal.Parse(inicio.ToString()); j < decimal.Parse(fin.ToString()); j++)
                    count += array[int.Parse(j.ToString())];
            }
            else
            {
                for (var j = decimal.Parse(inicio.ToString()); j < 24; j++)
                    count += array[int.Parse(j.ToString())];
                for (var k = 0; k < decimal.Parse(fin.ToString()); k++)
                    count += array[int.Parse(k.ToString())];
            }

            if (count == 0)
                return true;
            else
                return false;
        }

        private int estaEnElRango(decimal inicio,decimal fin,decimal inicioNuevo,decimal finNuevo)
        {
            if (fin > inicio)
            {
                if ((inicio <= inicioNuevo && fin < inicioNuevo) || (inicio <= finNuevo && fin < finNuevo))
                {
                    return 1;
                }
            }
            else {
                if (
                    (inicio <= inicioNuevo && inicioNuevo <= 23) || ((0 <= inicioNuevo && inicioNuevo <= fin))
                    &&
                    (inicio <= finNuevo && finNuevo <= 23) || ((0 <= finNuevo && finNuevo <= fin))
                    )
                {
                    return 1;
                }
            
            }

                return 0;
        }

        private void txtValorBandera_Validated(object sender, EventArgs e)
        {
            if (!Utiles.EsDecimal(txtValorBandera.Text))
            {
                errProvider.SetError(txtValorBandera, "Solo puede ingresar números");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtValorBandera, "");
            }

        }

        private void txtValorFicha_Validated(object sender, EventArgs e)
        {
            if (!Utiles.EsDecimal(txtValorFicha.Text))
            {
                errProvider.SetError(txtValorFicha, "Solo puede ingresar números");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtValorFicha, "");
            }

        }

        private void txtDescripcion_Validated(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtDescripcion.Text))
            {
                errProvider.SetError(txtDescripcion, "Debe ingresar la descripcion");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtDescripcion, "");
            }

        }

       #endregion


    }
}
